package biblio.dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Classe_table.Adherent;
import Classe_table.Employe;
import Classe_table.Utilisateur;
import enumeration.EnumCategorieEmploye;

public class UtilisateursDao {
	
	private Connection cnx;
	

	public UtilisateursDao(Connection cnx) {
		super();
		this.cnx = cnx;
	}
	
	
	
	public void insertUtilisateur(Employe user) throws SQLException
	{
		String cmd_sql ="INSERT INTO UTILISATEUR ( IDUTILISATEUR, NOM, PRENOM, PWD, PSEUDONYME, DATENAISSANCE, SEXE, CATEGORIEUTILISATEUR)"
				+ " VALUES (SEQ_UTILISATEUR.NEXTVAL, ?, ?, ?, ?, ?, ?, ? )";
		PreparedStatement pstmt= cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getNom());
		pstmt.setString(2, user.getPrenom());
		pstmt.setString(3, user.getPwd());
		pstmt.setString(4, user.getPseudonyme());
		pstmt.setDate(5, new java.sql.Date(user.getDateNaissance().getTime()));
		pstmt.setString(6, user.getSexe());
		pstmt.setString(7, "EMPLOYE");
		pstmt.execute();
		pstmt.close();
		cmd_sql="INSERT INTO EMPLOYE (IDUTILISATEUR,CODEMATRICULE,CATEGORIEEMPLOYE) VALUES (SEQ_UTILISATEUR.CURRVAL,?,?)";
		pstmt=cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getCodeMatricule());
		pstmt.setString(2, user.getCategorieEmploye().toString());
		pstmt.execute();
		pstmt.close();
		ResultSet rs = cnx.prepareCall("select SEQ_UTILISATEUR.CURRVAL FROM DUAL").executeQuery();
		rs.next();
		user.setIdUtilisateur(rs.getInt(1));
	}
	
	public void insertUtilisateur(Adherent user) throws SQLException
	{
		String cmd_sql ="INSERT INTO UTILISATEUR ( IDUTILISATEUR, NOM, PRENOM, PWD, PSEUDONYME, DATENAISSANCE, SEXE, CATEGORIEUTILISATEUR)"
				+ " VALUES (SEQ_UTILISATEUR.NEXTVAL, ?, ?, ?, ?, ?, ?, ? )";
		PreparedStatement pstmt= cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getNom());
		pstmt.setString(2, user.getPrenom());
		pstmt.setString(3, user.getPwd());
		pstmt.setString(4, user.getPseudonyme());
		pstmt.setDate(5, new java.sql.Date(user.getDateNaissance().getTime()));
		pstmt.setString(6, user.getSexe());
		pstmt.setString(7, "ADHERENT");
		pstmt.execute();
		pstmt.close();
		cmd_sql="INSERT INTO ADHERENT (IDUTILISATEUR,TELEPHONE) VALUES (SEQ_UTILISATEUR.CURRVAL,?)";
		pstmt=cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getTelephone());
		pstmt.execute();
		pstmt.close();
		ResultSet rs = cnx.prepareCall("select SEQ_UTILISATEUR.CURRVAL FROM DUAL").executeQuery();
		rs.next();
		user.setIdUtilisateur(rs.getInt(1));
	}
	

	public void updateUtilisateur(Employe user) throws SQLException
	{
		String cmd_sql="UPDATE UTILISATEUR SET NOM=?, PRENOM=?,PWD=?,PSEUDONYME=?,DATENAISSANCE=?,SEXE=?,CATEGORIEUTILISATEUR=?"
				+ "WHERE IDUTILISATEUR="+user.getIdUtilisateur();	
		PreparedStatement pstmt= cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getNom());
		pstmt.setString(2, user.getPrenom());
		pstmt.setString(3, user.getPwd());
		pstmt.setString(4, user.getPseudonyme());	
		pstmt.setDate(5, new java.sql.Date(user.getDateNaissance().getTime()));
		pstmt.setString(6, user.getSexe());
		pstmt.setString(7, "EMPLOYE");
		pstmt.execute();
		pstmt.close();
		cmd_sql="UPDATE EMPLOYE SET CODEMATRICULE=?,CATEGORIEEMPLOYE=? WHERE IDUTILISATEUR  ="+user.getIdUtilisateur();
		pstmt.setString(1, user.getCodeMatricule());
		pstmt.setString(2, user.getCategorieEmploye().toString());
		pstmt.execute();
		pstmt.close();
	}
	
	
	public void updateUtilisateur(Adherent user) throws SQLException
	{
		String cmd_sql="UPDATE UTILISATEUR SET NOM=?, PRENOM=?,PWD=?,PSEUDONYME=?,DATENAISSANCE=?,SEXE=?,CATEGORIEUTILISATEUR=?"
				+ "WHERE IDUTILISATEUR="+user.getIdUtilisateur();	
		PreparedStatement pstmt= cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getNom());
		pstmt.setString(2, user.getPrenom());
		pstmt.setString(3, user.getPwd());
		pstmt.setString(4, user.getPseudonyme());	
		pstmt.setDate(5, new java.sql.Date(user.getDateNaissance().getTime()));
		pstmt.setString(6, user.getSexe());
		pstmt.setString(7, "ADHERENT");
		pstmt.execute();
		pstmt.close();
		cmd_sql="UPDATE ADHERENT SET TELEPHONE=? WHERE IDUTILISATEUR ="+user.getIdUtilisateur();
		pstmt= cnx.prepareStatement(cmd_sql);
		pstmt.setString(1, user.getTelephone());
		pstmt.execute();
		pstmt.close();
	}
	
	
	public void deleteUser(Employe user) throws SQLException
	{
		String cmd_sql ="DELETE FROM EMPLOYE WHERE IDUTILISATEUR="+user.getIdUtilisateur();
		String cmd_sql2 ="DELETE FROM UTILISATEUR WHERE IDUTILISATEUR="+user.getIdUtilisateur();
		cnx.prepareStatement(cmd_sql).execute();
		cnx.prepareStatement(cmd_sql2).execute();
	}
	
	public void deleteUser(Adherent user) throws SQLException
	{
		String cmd_sql ="DELETE FROM ADHERENT WHERE IDUTILISATEUR="+user.getIdUtilisateur();
		String cmd_sql2 ="DELETE FROM UTILISATEUR WHERE IDUTILISATEUR="+user.getIdUtilisateur();
		cnx.prepareStatement(cmd_sql).execute();
		cnx.prepareStatement(cmd_sql2).execute();
	}
	
	
	
	public Utilisateur findBykey(int idUtilisateur) throws SQLException
	{
		String cmd_SQL="select NOM,PRENOM,DATENAISSANCE,SEXE,IDUTILISATEUR,PWD,PSEUDONYME,CATEGORIEUTILISATEUR "
				+ "FROM UTILISATEUR "
				+ "WHERE IDUTILISATEUR=?";
		PreparedStatement pstmt=cnx.prepareStatement(cmd_SQL);
		pstmt.setInt(1, idUtilisateur);
		ResultSet rs = pstmt.executeQuery();
		rs.next();
		String adherent=rs.getString("CATEGORIEUTILISATEUR");
		if(adherent.equals("ADHERENT"))
		{
			String cmd_SQL2="SELECT TELEPHONE FROM ADHERENT WHERE IDUTILISATEUR="+idUtilisateur;
			ResultSet rs2= cnx.prepareStatement(cmd_SQL2).executeQuery();
			rs2.next();
			return new Adherent(rs.getString("NOM"), rs.getString("PRENOM"), rs.getDate("DATENAISSANCE"), rs.getString("SEXE"), rs.getInt("IDUTILISATEUR"), rs.getString("PWD"), rs.getString("PSEUDONYME"), rs2.getString("TELEPHONE"));
		}
		else
		{
			String cmd_SQL3="SELECT CODEMATRICULE,CATEGORIEEMPLOYE FROM EMPLOYE WHERE IDUTILISATEUR="+idUtilisateur;
			ResultSet rs3=cnx.prepareStatement(cmd_SQL3).executeQuery();
			rs3.next();
			EnumCategorieEmploye temp_emp;
			if(rs3.getString("CATEGORIEEMPLOYE").equals("BIBLIOTHECAIRE"))
				temp_emp= EnumCategorieEmploye.BIBLIOTHECAIRE;
			else if (rs3.getString("CATEGORIEEMPLOYE").equals("GESTIONNAIRE"))
				temp_emp=EnumCategorieEmploye.GESTIONNAIRE_DE_FONDS;
			else
				temp_emp=EnumCategorieEmploye.RESPONSABLE;
			return new Employe(rs.getString("NOM"), rs.getString("PRENOM"), rs.getDate("DATENAISSANCE"), rs.getString("SEXE"), rs.getInt("IDUTILISATEUR"), rs.getString("PWD"),  rs.getString("PSEUDONYME"), rs3.getString("CODEMATRICULE"), temp_emp);
		}
	}
	
	public List<Utilisateur> findall() throws SQLException
	{
		List<Utilisateur> findall= new ArrayList<Utilisateur>();
		String cmd_SQL="select NOM,PRENOM,DATENAISSANCE,SEXE,IDUTILISATEUR,PWD,PSEUDONYME,CATEGORIEUTILISATEUR "
				+ "FROM UTILISATEUR ";
		PreparedStatement pstmt=cnx.prepareStatement(cmd_SQL);
		ResultSet rs = pstmt.executeQuery();
		String adherent;
		int idUtilisateur;
		while(rs.next())
		{
		idUtilisateur=rs.getInt("IDUTILISATEUR");
		adherent=rs.getString("CATEGORIEUTILISATEUR");
		if(adherent.equals("ADHERENT"))
		{
			String cmd_SQL2="SELECT TELEPHONE FROM ADHERENT WHERE IDUTILISATEUR="+idUtilisateur;
			ResultSet rs2= cnx.prepareStatement(cmd_SQL2).executeQuery();
			rs2.next();
			findall.add(new Adherent(rs.getString("NOM"), rs.getString("PRENOM"), rs.getDate("DATENAISSANCE"), rs.getString("SEXE"), rs.getInt("IDUTILISATEUR"), rs.getString("PWD"), rs.getString("PSEUDONYME"), rs2.getString("TELEPHONE")));
		}
		else
		{
			String cmd_SQL3="SELECT CODEMATRICULE,CATEGORIEEMPLOYE FROM EMPLOYE WHERE IDUTILISATEUR="+idUtilisateur;
			ResultSet rs3=cnx.prepareStatement(cmd_SQL3).executeQuery();
			rs3.next();
			EnumCategorieEmploye temp_emp;
			if(rs3.getString("CATEGORIEEMPLOYE").equals("BIBLIOTHECAIRE"))
				temp_emp= EnumCategorieEmploye.BIBLIOTHECAIRE;
			else if (rs3.getString("CATEGORIEEMPLOYE").equals("GESTIONNAIRE"))
				temp_emp=EnumCategorieEmploye.GESTIONNAIRE_DE_FONDS;
			else
				temp_emp=EnumCategorieEmploye.RESPONSABLE;
			findall.add(new Employe(rs.getString("NOM"), rs.getString("PRENOM"), rs.getDate("DATENAISSANCE"), rs.getString("SEXE"), rs.getInt("IDUTILISATEUR"), rs.getString("PWD"),  rs.getString("PSEUDONYME"), rs3.getString("CODEMATRICULE"), temp_emp));
		}
	}
		return findall;
	}
	
	
	
	
	
}
